package main

import (
	"encoding/json"
	"fmt"
)

type userInfo struct {
	Name string
	// 序列化成json字符串时，该字段名为小写的 "age"
	Age   int `json:"age"`
	Hobby []string
}

func main() {
	// 基础类型 序列化
	bolB, _ := json.Marshal(true)
	fmt.Println(string(bolB)) // true
	intB, _ := json.Marshal(1)
	fmt.Println(string(intB)) // 1
	fltB, _ := json.Marshal(2.34)
	fmt.Println(string(fltB)) // 2.34
	strB, _ := json.Marshal("gopher")
	fmt.Println(string(strB)) // "gopher"

	// 切片 和 map 序列化
	slcD := []string{"apple", "peach", "pear"}
	slcB, _ := json.Marshal(slcD)
	fmt.Println(string(slcB)) // ["apple","peach","pear"]
	mapD := map[string]int{"apple": 5, "lettuce": 7}
	mapB, _ := json.Marshal(mapD)
	fmt.Println(string(mapB)) // {"apple":5,"lettuce":7}

	// 对象 序列化为 字节数组(json)
	a := userInfo{Name: "wang", Age: 18, Hobby: []string{"Golang", "TypeScript"}}
	buf, err := json.Marshal(a)
	if err != nil {
		panic(err)
	}
	fmt.Println(buf) // [123 34 78 97...]
	// 字节数组 转 可读性更高的string
	fmt.Println(string(buf)) // {"Name":"wang","age":18,"Hobby":["Golang","TypeScript"]}

	// 对象 序列化为 字节数组(json) - 增加缩进，可读性更高
	buf, err = json.MarshalIndent(a, "", "    ")
	if err != nil {
		panic(err)
	}
	fmt.Println(string(buf))

	var b userInfo
	// 字节数组(json) 反序列化为 对象
	err = json.Unmarshal(buf, &b)
	if err != nil {
		panic(err)
	}
	fmt.Printf("%#v\n", b) // main.userInfo{Name:"wang", Age:18, Hobby:[]string{"Golang", "TypeScript"}}

	// []byte后面跟括号来定义字节数组（也可以理解成将字符串转为字节数组）
	byt := []byte(`{"num":6.13,"strs":["a","b"]}`)
	var dat map[string]interface{}
	// 字节数组(json) 反序列化为 string 为键，值为任意值的map
	if err := json.Unmarshal(byt, &dat); err != nil {
		panic(err)
	}
	fmt.Println(dat) // map[num:6.13 strs:[a b]]
}
